/********************************************************************/
/*************** 为Base*.vue正常执行逻辑提供的常用的方法 ***************/
/********************************************************************/

// import { defaultRegexp } from "@/consts";
import { defaultRegexp } from "flc-base-utils";
import type { StrNum } from "@/types";

/**
 * 文本是否已超出（出现了省略号）
 * @param {target} target 目标dom元素
 */
export function getIsOver(target: any) {
  if (!target) return false;
  const { scrollHeight, clientHeight } = target;
  return scrollHeight > clientHeight;
}

/**
 * 获取浏览器默认语言
 * @returns {string} zh | en
 */
export function getBrowserLang() {
  const lang = navigator.language.toLowerCase();
  return ["cn", "zh", "zh-cn"].includes(lang) ? "zh" : "en";
}

/**
 * 把css的值转换下，如果已经带有单位，则返回原值，如果没有带单位，则加上px
 * @param {string,number,undefined} val   数值
 * @param {string} unit  单位
 * @returns
 */
export const toCssVal = (val: number | string | undefined, unit = "px") => {
  val = String(val);
  const isOnlyNum = defaultRegexp.onlyNum.test(val);
  return isOnlyNum ? val + unit : val;
};

/**
 * 获取size数值
 * @param size size大小
 * @returns {undefined | number}
 */
export function getCssNum(size?: StrNum) {
  if (typeof size === "string") return parseInt(size);
  return size;
}

/**
 * 获取css值的单位
 * @param {string} val  数值
 * @returns {string}
 */
export const getCssValUnit = (val: string) => {
  const res = val.match(defaultRegexp.lowerChar);
  return res ? res[0] : "";
};

/**
 * 把css的值转换下，如果已经带有单位，则返回原值，如果没有带单位，则加上px
 * @param {string,number,undefined} val  数值
 * @param {string} operator 运算符号，可选值：+, -, *, /
 * @param {string} num 操作数
 * @returns {string}
 */
type CalCssValOperator = "+" | "-" | "*" | "/";
export const calCssVal = (
  val: StrNum,
  operator: CalCssValOperator,
  num: number
): string => {
  val = String(val);
  const unit = getCssValUnit(val);
  const newVal = parseFloat(val);
  let end; //运算结果
  switch (operator) {
    case "+":
      end = newVal + num;
      break;
    case "-":
      end = newVal - num;
      break;
    case "*":
      end = newVal * num;
      break;
    case "/":
      end = newVal / num;
      break;
    default:
      throw new Error("暂不支持此运算符进行运算：" + operator);
  }
  return end + unit;
};
